﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using BE;
using BE.SearchCriteria;

namespace DAL
{
   public class PedidoArticuloDAL:BaseDAL
    {

       public void InsertarPedidoArticulo(PedidoArticuloBE PedidoArticulo)
       {
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "PedidoArticulos_i";
                   cmd.Parameters.Add(new SqlParameter("@IdPedido", PedidoArticulo.IdPedido ));
                   cmd.Parameters.Add(new SqlParameter("@IdArticulo", PedidoArticulo.Articulo.IdArticulo));
                   cmd.Parameters.Add(new SqlParameter("@IdPresentacion", PedidoArticulo.Articulo.Presentacion.IdPresentacion));
                   cmd.Parameters.Add(new SqlParameter("@Cantidad", PedidoArticulo.Cantidad));
                   cmd.Parameters.Add(new SqlParameter("@PrecioUnitario", PedidoArticulo.PrecioUnitario ));

                   cnn.Open();
                   cmd.ExecuteNonQuery();
           }
       }

       public PedidoArticuloBE SeleccionarPorId(PedidoArticuloBE pPedidoArticuloBE)
       {
           PedidoArticuloBE oPedidoArticuloBE = null;
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = cnn;
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.Parameters.Add(new SqlParameter("@IdPedido", pPedidoArticuloBE.IdPedido));
               cmd.CommandText = "PedidoArticulo_GetById";
               cnn.Open();
               SqlDataReader reader = null;
               reader = cmd.ExecuteReader();

               if (reader.HasRows)
               {
                   if (reader.Read())
                       oPedidoArticuloBE = ConstruirPedidoArticulo(reader);
               }

           }
           return oPedidoArticuloBE;
       }

       private PedidoArticuloBE ConstruirPedidoArticulo(SqlDataReader reader)
       {
           PedidoArticuloBE oPedidoArticuloBE = new PedidoArticuloBE();
           Object[] values = new Object[reader.FieldCount];

           reader.GetValues(values);

           oPedidoArticuloBE.IdPedidoArticulo = Int32.Parse(reader["IdPedidoArticulo"].ToString());
           oPedidoArticuloBE.Cantidad = Int32.Parse(reader["Cantidad"].ToString());
           oPedidoArticuloBE.PrecioUnitario = Decimal.Parse(reader["PrecioUnitario"].ToString());

           oPedidoArticuloBE.Articulo = new ArticuloBE();
           if (reader["IdArticulo"] != DBNull.Value)
           {
               oPedidoArticuloBE.Articulo.IdArticulo = Int32.Parse(reader["IdArticulo"].ToString());
               oPedidoArticuloBE.Articulo.Nombre = reader["Nombre"].ToString();
               oPedidoArticuloBE.Articulo.Descripcion  = reader["Descripcion"].ToString();
               oPedidoArticuloBE.Articulo.Precio = Convert.ToDecimal(reader["Precio"]);
           }

           oPedidoArticuloBE.Articulo.Presentacion  = new PresentacionBE();
           if (reader["IdPresentacion"] != DBNull.Value)
           {
               oPedidoArticuloBE.Articulo.Presentacion.IdPresentacion = Int32.Parse(reader["IdPresentacion"].ToString());
               oPedidoArticuloBE.Articulo.Presentacion.Descripcion = reader["Presentacion"].ToString(); 
           }

           return oPedidoArticuloBE;
       }

       public List<PedidoArticuloBE> SeleccionarPorParametros(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
       {
           PedidoArticuloSC wFiltroSC = (PedidoArticuloSC)pFiltroSC;
           if (wFiltroSC == null)
               wFiltroSC = new PedidoArticuloSC();

           List<PedidoArticuloBE> listaDePedidoArticuloBE = null;
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = cnn;
               cmd.CommandType = CommandType.StoredProcedure;
               //cmd.Parameters.Add(new SqlParameter("@IdPedidoArticulo", wFiltroSC.IdPedidoArticulo));
               cmd.Parameters.Add(new SqlParameter("@IdPedido", wFiltroSC.IdPedido));
               cmd.Parameters.Add(new SqlParameter("@pagesize", pPageSize));
               cmd.Parameters.Add(new SqlParameter("@pagenum", pPageNum));

               SqlParameter p = new SqlParameter();
               p.ParameterName = "@PageCount";
               p.Direction = ParameterDirection.Output;
               p.SqlDbType = SqlDbType.Int;
               cmd.Parameters.Add(p);

               cmd.CommandText = "PedidoArticulo_GetAllPaginated";
               cnn.Open();
               SqlDataReader reader = null;
               reader = cmd.ExecuteReader();

               if (reader.HasRows)
               {
                   listaDePedidoArticuloBE = new List<PedidoArticuloBE>();

                   while (reader.Read())
                   {
                       PedidoArticuloBE oPedidoArticuloBE = ConstruirPedidoArticulo(reader);

                       listaDePedidoArticuloBE.Add(oPedidoArticuloBE);
                   }
               }
               reader.Close();
               pCountReg = (Int32)cmd.Parameters["@PageCount"].Value;

           }
           return listaDePedidoArticuloBE;
       }

       public void DeleteByIdPedidoArticulo(int pIdPedido)
       {
           try
           {
               using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
               {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "PedidosArticulos_d_byIdPedido";
                   cmd.Parameters.Add(new SqlParameter("@IdPedido", pIdPedido));
                   cnn.Open();
                   cmd.ExecuteNonQuery();
               }
           }
           catch (Exception)
           { throw; }

       }

       public void InsertarPedidoArticuloList(List<PedidoArticuloBE> pListElemBE)
       {
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               try
               {
                   cnn.Open();

                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "PedidoArticulos_i";

                   SqlParameter oParamIdPedido = cmd.Parameters.Add(new SqlParameter("@IdPedido", SqlDbType.Int));
                   SqlParameter oParamIdArticulo = cmd.Parameters.Add(new SqlParameter("@IdArticulo", SqlDbType.Int));
                   SqlParameter oParamIdPresentacion = cmd.Parameters.Add(new SqlParameter("@IdPresentacion", SqlDbType.Int));
                   SqlParameter oParamCantidad = cmd.Parameters.Add(new SqlParameter("@Cantidad", SqlDbType.Int));
                   SqlParameter oParamPrecioUnitario = cmd.Parameters.Add(new SqlParameter("@PrecioUnitario", SqlDbType.Money));

                   foreach (var oPedidoArticulo in pListElemBE)
                   {
                      
                       oParamIdPedido.Value = oPedidoArticulo.IdPedido;
                       oParamIdArticulo.Value = oPedidoArticulo.Articulo.IdArticulo;
                       oParamIdPresentacion.Value = oPedidoArticulo.Articulo.Presentacion.IdPresentacion;
                       oParamCantidad.Value = oPedidoArticulo.Cantidad;
                       oParamPrecioUnitario.Value = oPedidoArticulo.PrecioUnitario;   

                       cmd.ExecuteNonQuery();
                   }
               }
               catch (Exception)
               {
                   throw;
               }

           }
       }
    }
}
